package com.ksc.util;

import java.time.LocalDateTime;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.HashSet;

public class CheckPassportUtil {
    // 保持常量不变
    final static int min = 10;
    final static int historySize = 3;
    public ArrayDeque<String> passwordHistory = new ArrayDeque<>();

    // 优化后的changePswd方法
    public boolean changePswd(String account, String oldPswd, String newPswd) {
        // 检查输入值是否为空
        if (account == null || oldPswd == null || newPswd == null) {
            System.out.println("输入值不能为空");
            return false;
        }

        // 进行密码检查
        if (!checkPassword(newPswd, account)) {
            return false;
        }

        // 检查新密码与旧密码是否相同
        if (newPswd.equals(oldPswd)) {
            System.out.println("新密码不能与旧密码相同");
            return false;
        }

        // 检查新密码是否与历史密码相同
        if (passwordHistory.contains(newPswd)) {
            System.out.println("新密码不能与历史密码相同");
            return false;
        }

        // 更新密码历史
        passwordHistory.offerLast(newPswd);
        while (passwordHistory.size() > historySize) {
            passwordHistory.pollFirst();
        }

        return true;
    }

    // 集中处理密码检查逻辑
    private boolean checkPassword(String newPswd, String account) {
        // 密码长度检查
        if (newPswd.length() < min) {
            System.out.println("密码长度不足");
            return false;
        }

        // 密码不能包含账号
        if (newPswd.toLowerCase().contains(account)) {
            System.out.println("密码不能包含账号");
            return false;
        }

        // 密码不能包含空格
        if (newPswd.contains(" ")) {
            System.out.println("密码不能包含空格");
            return false;
        }

        // 密码不能包含连续相同字符
        for (int i = 0; i < newPswd.length() - 2; i++) {
            if (newPswd.charAt(i) == newPswd.charAt(i + 1) && newPswd.charAt(i + 1) == newPswd.charAt(i + 2)) {
                System.out.println("密码不能包含连续相同字符");
                return false;
            }
        }

        // 密码不能包含敏感词
        if (containsSensitiveWord(newPswd.toLowerCase())) {
            System.out.println("密码不能包含敏感词");
            return false;
        }

        // 密码复杂度检查
        if (!checkPasswordComplexity(newPswd)) {
            System.out.println("密码复杂度不足");
            return false;
        }

        return true;
    }

    // 检查密码是否包含敏感词
    private boolean containsSensitiveWord(String newPswd) {
        String[] keywords = {"kingsoft", "wps", "com/ksc", "xsj", "king"};
        HashSet<String> keywordSet = new HashSet<>(Arrays.asList(keywords));
        for (String word : keywordSet) {
            if (newPswd.contains(word)) {
                return true;
            }
        }
        return false;
    }

    // 检查密码复杂度
    private boolean checkPasswordComplexity(String newPswd) {
        int complexity = 0;
        if (hasUpperCase(newPswd)) complexity++;
        if (hasLowerCase(newPswd)) complexity++;
        if (hasDigit(newPswd)) complexity++;
        if (hasSpecialChar(newPswd)) complexity++;
        return complexity >= 3;
    }

    // 辅助方法：检查密码中是否包含大写字母
    private boolean hasUpperCase(String str) {
        return str.matches(".*[A-Z].*");
    }

    // 辅助方法：检查密码中是否包含小写字母
    private boolean hasLowerCase(String str) {
        return str.matches(".*[a-z].*");
    }

    // 辅助方法：检查密码中是否包含数字
    private boolean hasDigit(String str) {
        return str.matches(".*\\d.*");
    }

    // 辅助方法：检查密码中是否包含特殊字符
    private boolean hasSpecialChar(String str) {
        return str.matches(".*[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?].*");
    }

    //比较两个时间之间的间隔有没有大于90天
    public boolean CheckPasswordValidity(LocalDateTime ptime, LocalDateTime nowtime) {
        if (nowtime.isAfter(ptime.plusDays(90))) {
            System.out.println("密码过期");
            return false;
        } else {
            System.out.println("密码未过期");
            return true;
        }
    }
}
